"""
为类和静态方法提供装饰器

问题：
   你想给类或静态方法提供装饰器。
解决方案：
   给类或静态方法提供装饰器是很简单的，不过要确保装饰器在 @classmethod 或 @staticmethod 之前。
"""

import time
from functools import wraps


def cost_time(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("耗时：", end_time - start_time)
        return result

    return wrapper


class User:
    @cost_time
    def say(self, n):
        print(self, n)
        while n > 0:
            n -= 1

    @classmethod
    @cost_time
    def say_hi(cls, n):
        print(cls, n)
        while n > 0:
            n -= 1

    @staticmethod
    @cost_time
    def say_hello(n):
        print(n)
        while n > 0:
            n -= 1


def use_user():
    user = User()
    # 实例方法：只能通过实例进行调用（用于数据输出，传入参数self）
    user.say(100000)
    # 类方法：更关注从类中调用方法，而不是在实例中（用于数据转换，传入参数cls）
    User.say_hi(100000)
    # 静态方法：主要处理与这个类的逻辑关联（用于数据校验）
    User.say_hello(100000)
    # 输出结果：
    """
    <__main__.User object at 0x10d9f19e8> 100000
    耗时： 0.021318912506103516
    <class '__main__.User'> 100000
    耗时： 0.016045093536376953
    100000
    耗时： 0.014467000961303711
    """


if __name__ == '__main__':
    use_user()
